package com.fecean.aabbc.commons.easy;

import com.fecean.aabbc.commons.enums.IEnum;

import java.util.EnumSet;
import java.util.Objects;
import java.util.Optional;

/**
 ** 枚举类
 *
 * @author: chenfenghai
 * @version: 1.0
 * @date: 2019-12-11 16:17
 * @blame Team
 */
public class EasyEnum {

    /**
     ** 根据枚举的编码，获取当前枚举类型，但枚举必须实现IEnum，返回Optional<T>
     * @param <T> 枚举类型
     * @param clazz 枚举类型Class
     * @param code 枚举编码
     * @return Optional<T>
     * @throws NullPointerException – if clazz or code is null
     * @see EnumSet#allOf(Class)
     */
    public static <T extends Enum<T> & IEnum> Optional<T> getEnumByCode(final Class<T> clazz, final Object code) {
        Objects.requireNonNull(clazz, "The clazz parameter is null");
        Objects.requireNonNull(code, "The code parameter is null");
        return EnumSet.allOf(clazz).stream()
                .filter((item)-> code.toString().equals(item.getCode().toString()))
                .findFirst();
    }

    /**
     ** 根据枚举的文本，获取当前枚举类型，但枚举必须实现IEnum，返回Optional<T>
     * @param <T> 枚举类型
     * @param clazz 枚举类型Class
     * @param text 枚举文本
     * @return Optional<T>
     * @throws NullPointerException – if clazz or text is null
     * @see EnumSet#allOf(Class)
     */
    public static <T extends Enum<T> & IEnum> Optional<T> getEnumByText(final Class<T> clazz, final Object text) {
        Objects.requireNonNull(clazz, "The clazz parameter is null");
        Objects.requireNonNull(text, "The text parameter is null");
        return EnumSet.allOf(clazz).stream()
                .filter((item)-> text.toString().equals(item.getText()))
                .findFirst();
    }
}
